Ext.namespace("Nippy.Components");

Nippy.Components.SiteTree = Ext.extend(Ext.tree.TreePanel, {
    constructor: function(config){
		Nippy.Components.SiteTree.superclass.constructor.apply(this, arguments);
    }
	,initComponent: function(){
		this._buffer = null; //буфер обмена
		this._rootMenu = new Ext.menu.Menu({
				items: [ {scope: this, text: 'Добавить подузел',handler: this.addNode}
				,'-'
				,{scope: this, text: 'Вставить',handler: this.pasteNode, disabled: true, id: 'p3',act: 0}
				,{scope: this, text: 'Вставить дерево',handler: this.pasteNode, disabled: true, id: 'p4',act: 1}
				,'-'
				//,{scope: this, text: 'Обновить .htaccess',handler: this.refreshUrl}
				//,{scope: this, text: 'Обновить все узлы',handler: this.refreshNodes}
				//,'-'
				//,{scope: this, text: 'Очистить кеш',handler: this.clearCache}
	        ]
	    });
		this._menu = new Ext.menu.Menu({
			items: [ {scope: this, text: 'Редактировать узел',handler: this.editNodeInEditorClick} 
				,{scope: this, text: 'Добавить подузел',handler: this.addNode}
				,{scope: this, text: 'Обновить узлы',handler: this.refreshSubNodes}
				,'-'
				,{scope: this, text: 'Вырезать',handler: this.copyOrCutNode,act: 1}
				,{scope: this, text: 'Копировать',handler: this.copyOrCutNode,act: 0}
				,{scope: this, text: 'Вставить',handler: this.pasteNode, disabled: true, id: 'p1',act: 0}
				,{scope: this, text: 'Вставить дерево',handler: this.pasteNode, disabled: true, id: 'p2',act: 1}
				,'-'
				,{scope: this, text: 'Изменить конфигурацию',handler: this.editNode}
				,'-'
				,{scope: this, text: 'Удалить узел',handler: this.deleteNode}
            ]
        });
		this.root.nodeType = 'async';
		this.root.draggable = false;
		this._menu.parent = this;
		Ext.apply(this, {
		        useArrows: true,
		        autoScroll: true,
		        animate: true,
		        enableDD: true,
				ddGroup: 'siteTreeDDGroup',
		        containerScroll: true,
		        border: false,
		        loader: new Ext.tree.TreeLoader({requestMethod: 'GET', nodeParameter: 'pId',dataUrl: '/admin/tree/children/'}),
				listeners: {
		        	contextmenu: function( node, e)
		        	{
						var m = (this.getRootNode().id == node.id) ? this._rootMenu : this._menu;
		            	var coords = e.getXY();
		            	m.nodeId = node.id;
		            	m.showAt([coords[0], coords[1]]);
		            	e.stopEvent();
		        	},
		        	dragdrop: function( tree, node, dd, e ){
						var d=dd.dragOverData;
						if (d==undefined) return;
						var mt=0;
		        		switch(d.point){
		        			case 'append': mt=0; break;
		        			case 'below': mt=1; break;
		        			case 'above': mt=2; break;
		        			default: alert('не поддерживается: '+d.point);
		        		}
		    			Ext.Ajax.request({
		    		 		   url: '/admin/tree/move-node/?id='+d.data.node.attributes.id+'&dId='+d.target.attributes.id+'&movetype='+mt,
		    		 		   method: 'GET',
		    		 		   scope: this,
		    		 		   failure: function(rsp){this.sb.setStatus({text: 'Ошибка. Не удалось вставить узел',iconCls: 'x-status-invalid',clear: true});},
		    		 		   success: function(rsp)
		    		 		   {
		    		 			   var r = eval("("+rsp.responseText+")");
		    		 			   this.sb.setStatus({text: 'Узел вставлен',iconCls: 'x-status-valid',clear: true});
		    		 		   }
		    		 	});
		        	}
				}
			}
		);
		Nippy.Components.SiteTree.superclass.initComponent.apply(this, arguments);
	}
	,editNodeInEditorClick: function(item, e){this.loadNodeEditor(item.parentMenu.nodeId);}
	,loadNodeEditor: function(id)
	{
		Ext.Ajax.request({
			url: '/admin/tree/load-editor/?id='+id,
			method: 'GET',
			scope: this,
			failure: function(rsp){
				sb.setStatus({
		    	    text: 'Не удалось загрузить редактор',
		    	    iconCls: 'x-status-invalid',
		    	    clear: true
		    	});},
			success: function(rsp)
			{
				var r = eval("("+rsp.responseText+")"); 
				var editor = eval("new "+r.editor+"({nodeId: "+r.obj.Id+"})");
				editor.on('onsaved', this.onSaved,this);	
				editor.on('onclosing', this.onClosing,this);
				editor.on('onfailed', this.onFailed,this);
				this.tab.add(editor).show();
				editor.fillForm(r.obj);
			}
		});
	}
	,onSaved: function(e){this.sb.setStatus({text: 'Узел сохранен',iconCls: 'x-status-valid',clear: true});}
	,onClosing: function(e){this.tab.remove(e);}
	,onFailed: function(e,msg){this.sb.setStatus({text: 'Узел не сохранен: '+msg,iconCls: 'x-status-invalid',clear: true});}
	,editNode: function(item,e){
		var editor = new Nippy.Components.NodeEditors.NodeEditor({layoutStore: this.layoutStore, cfgStore: this.cfgStore, nodeId: item.parentMenu.nodeId});
		editor.on('onclosing', this.onClosing,this);
		editor.on('onfailed', this.onFailed,this);
		editor.on('onsaved',function(e) {
			this.onSaved(e);
			this.getNodeById(e.nodeId).setText(e.node.text);
		},this);
		this.tab.add(editor).show();
	}
	,addNode: function(item,e){
		var editor = new Nippy.Components.NodeEditors.NodeEditor({layoutStore: this.layoutStore,cfgStore: this.cfgStore, parentId: item.parentMenu.nodeId});
		editor.on('onclosing', this.onClosing,this);
		editor.on('onfailed', this.onFailed,this);
		editor.on('onsaved',function(e) {
			this.onSaved(e);
			this.loadNodeEditor(e.nodeId);
			var n = this.getNodeById(e.parentId);
			n.appendChild(e.node);
			e.closeClick();
		},this);
    	this.tab.add(editor).show();
	}
	,deleteNode: function(item,e){
		Ext.Msg.confirm('Подтверждение', 'Вы уверены, что хотите удалить узел и все вложенные в него узлы?',this.delNodeConfirmed,{tree: this, id:item.parentMenu.nodeId});
	}
	,delNodeConfirmed: function(btn){
		if (btn!='yes') return;		
		Ext.Ajax.request({
		   url: '/admin/tree-node/?id='+this.id,
		   method: 'DELETE',
		   scope: this.tree,
		   failure: function(rsp){this.sb.setStatus({text: 'Ошибка. Узел не удален.',iconCls: 'x-status-invalid',clear: true});},
		   success: function(rsp)
		   {
			   var r = eval("("+rsp.responseText+")");
			   if (r.success)
			   {
				   var n = this.getNodeById(r.id);
				   if (n!=null) n.remove(true);
				   this.sb.setStatus({text: 'Узел удален',iconCls: 'x-status-valid',clear: true});
			   }
		   }
		});
	}
	,refreshUrl: function(){
		Ext.Ajax.request({
 		   url: '/admin/tree/refresh-url/',
 		   method: 'GET',
 		   scope: this,
 		   failure: this.sb.reqFailed,
 		   success: this.sb.reqSuccess
 		});
	}
	,refreshTree: function(){
		this.loader.load(this.root);
	}
	,refreshNodes: function(){
		Ext.Ajax.request({
				url: '/admin/tree/refresh-nodes/',
				method: 'GET',
				scope: this,
				failure: this.sb.reqFailed,
				success: this.sb.reqSuccess
	 		});
	}
	,refreshSubNodes: function(item,e){
		Ext.Ajax.request({
				url: '/admin/tree/refresh-sub-nodes/',
				method: 'GET',
				params: {nId: item.parentMenu.nodeId},
				scope: this,
				failure: this.sb.reqFailed,
				success: this.sb.reqSuccess
	 		});
	}
	,copyOrCutNode: function(item,e){
		this._buffer = [item.act,Number(item.parentMenu.nodeId)];
		this._menu.get('p1').enable();
		this._menu.get('p2').enable();
		this._rootMenu.get('p3').enable();
		this._rootMenu.get('p4').enable();
	}
	,pasteNode: function(item,e){
		this._menu.get('p1').disable();
		this._menu.get('p2').disable();
		this._rootMenu.get('p3').disable();
		this._rootMenu.get('p4').disable();
		if (Ext.isArray(this._buffer)){
			var u = this._buffer[0]==0? 'copy' : 'move';
			Ext.Ajax.request({
					url: '/admin/tree/'+u+'-node/?id='+this._buffer[1]+'&dId='+item.parentMenu.nodeId+'&withtree='+(item.act?'1':'0'),
					method: 'GET',
					scope: this,
					failure: function(rsp){this.sb.setStatus({text: 'Ошибка. Не удалось вставить узел',iconCls: 'x-status-invalid',clear: true});},
					success: function(rsp)
					{
					   var r = eval("("+rsp.responseText+")");
					   this.sb.setStatus({text: 'Узел вставлен',iconCls: 'x-status-valid',clear: true});
					}
		 		});
		}
		else
			Ext.Msg.alert('Ошибка','Данные из буфера не могут быть вставлены');
	}
	,clearCache: function(){
		Ext.Ajax.request({
				url: '/admin/tree/clear-cache/',
				method: 'GET',
				scope: this,
				failure: this.sb.reqFailed,
				success: this.sb.reqSuccess
	 		});
	}
	,updateSitemap: function(){
		Ext.Ajax.request({
				url: '/admin/sitemap/refresh-file/',
				method: 'GET',
				scope: this,
				failure: this.sb.reqFailed,
				success: this.sb.reqSuccess
	 		});
	}
});